/* Js de manejo de funciones comunes de Deudas
 * usado para modificacion, alta, vista y todo lo referido a Deudas
 *
 * Requiere util.sj
 * Requiere EXT
 *
 */    
    
/* Se ejecuta en el post del auto-complete
 * Se deja en hiddenAutoCompleteId (un hidden) el "id;apellido, nombre"
 * entonces se parsea y se saca el id y se deja en "studentId" y en 
 * "studentSurnameId" y "hiddenAutoCompleteSurname" se deja el "apellido, nombre"
 */
var postAutoComplete = function() {
    var hiddenAutoCompleteValue = $("hiddenAutoCompleteId").value;
    
    if (!Util.valid.isBlank(hiddenAutoCompleteValue)) {
        // Algo se trajo entonces se parsea
        var splitted = hiddenAutoCompleteValue.split(';'); 
        
        var id = splitted[0];
        var surnamePlusName = splitted[1];
        
        $("studentId").value = id;
        $("studentSurnameId").value = surnamePlusName;  
        $("hiddenAutoCompleteSurnameId").value = surnamePlusName;
        
        // Limpio lo que estaba antes....
        $("hiddenAutoCompleteId").value = "";
    }
    // TODO Analizar el else!!!
}

/* Popula por JSON los beneficios y descuentos disponibles
 * y los que existen ya seleccionados (solo estan los ids en hiddens ocultos)
 * los busca tambien de manera de obtener toda la informacion.
 * Se recibe todo en este orden: 
 *  beneficios_disponibles
 *  beneficios_seleccionados
 *  descuentos_disponibles
 *  descuentos_seleccionados
 * 
 */
var populateBenefitsAndDiscounts = function() {
    var url = "populateBenefitsAndDiscounts.do?selectedBenefits=";
    url+= $("selectedBenefitsId").value;
    url+= "&selectedDiscounts="; 
    url+= $("selectedDiscountsId").value;

    var ajaxRequest = new Ajax.Request( url, 
                                        {   method: 'get', 
                                            onSuccess: populateBenefitsAndDiscountsSucess, 
                                            onFailure: populateBenefitsAndDiscountsFailure
                                        }
                                      );
}

/* Respuesta del Pedido de Ajax.
 * Se toma como JSON
 * Carga los ULs con los LIs correspondientes a la respuesta
 */    
var populateBenefitsAndDiscountsSucess = function(transport, json) {
    var data = json;
    
    if (data.length != 4) {
        // Error. Se esperan 4 listas
        Ext.Msg.alert('Status', 'Error al traer informacion de Beneficios y Descuentos. Comuniquese con soporte.');
        return;
    }
    
    var destiny = $("availableBenefits");
    populateData(data[0], destiny);
    destiny = $("actualBenefits");
    populateData(data[1], destiny);
    destiny = $("availableDiscounts");
    populateData(data[2], destiny);
    destiny = $("actualDiscounts");
    populateData(data[3], destiny);

    // Inicializa los draggables|droppables|sortables
    Sortable.create("actualBenefits",{dropOnEmpty:true,containment:["actualBenefits","availableBenefits"],constraint:false});
    Sortable.create("availableBenefits",{dropOnEmpty:true,handle:'handle',containment:["actualBenefits","availableBenefits"],constraint:false});
    Sortable.create("actualDiscounts",{dropOnEmpty:true,containment:["actualDiscounts","availableDiscounts"],constraint:false});
    Sortable.create("availableDiscounts",{dropOnEmpty:true,handle:'handle',containment:["actualDiscounts","availableDiscounts"],constraint:false});

    // Se termino de cargar entonces se muestra la ventana
    benefitsAndDiscounts.showDialog();
}

/* Error de respuesta de JSON
 */
var populateBenefitsAndDiscountsFailure = function() {
    Ext.Msg.alert('Status', 'Error al traer informacion de Beneficios y Descuentos.');
}

/* Popula los datos en el ul 'destiny'. (libera lo q habia antes de popular)
 * Los datos poseen la siguiente informacion:
 *  id
 *  description
 *  value
 *  valueOrPercentageLabel
 */
var populateData = function(data, destiny) {
    var len = destiny.childNodes.length;
    for (var i = len - 1; i > -1; i--) {
        destiny.removeChild(destiny.childNodes[i]);
    }        
    // Saque lo q ya tenia

    if (data.length > 0) {
        for (var i = 0; i < data.length; i++) {
            destiny.appendChild(createLi(data[i].id, data[i].description, data[i].value, data[i].valueOrPercentageLabel));                
        }
    }
    else {
        // ver si vino UNO solo o si no vino nada
        if (data.description != undefined) {
            destiny.appendChild(createLi(data.id, data.description, data.value, data.valueOrPercentageLabel));                
        }
    }
}    

/* Crea un <LI> sortable y draggable
 * Usa greenListElement de dragdrop.css como css 
 */    
var createLi = function(id, description, value, valueOrPercentageLabel) {
    var li = document.createElement("li");
    li.id = id;
    li.className = "greenListElement";
    li.style.position = 'relative';
    li.title = valueOrPercentageLabel;
    li.innerHTML = description + " - " + value;
    
    return li;
}

/* Funcion para mostrar la pantalla de beneficios y descuentos. 
 * Llama por Ajax a un servicio q le devuelve toda la info
 * Toma la respuesta por JSON y luego recien ahi muestra la pantalla
 */    
var showBenefitsAndDiscounts = function() {
    populateBenefitsAndDiscounts();
}

/* Confirmacion de Beneficios y descuentos
 * Deja en los ocultos de Descuentos y Beneficios los ids separados por ';'
 * A su vez deja lo q el usario seleccion
 * Oculta la ventana
 */    
var confirmBenefitsAndDiscounts = function() {
    var ul = $("actualDiscounts");
    $("selectedDiscountsId").value = getLisIds(ul);
    var label = 'Valor';
    var discountValues = getValuesFromUL(ul, label);     
    $("discountValuesId").value = discountValues;
    label = 'Porcentaje';
    var discountPerc = getValuesFromUL(ul, label);     
    $("discountPercId").value = discountPerc;

    ul = $("actualBenefits");
    $("selectedBenefitsId").value = getLisIds(ul);
    label = 'Valor';
    var benefitValues = getValuesFromUL(ul, label);     
    $("benefitValuesId").value = benefitValues;
    label = 'Porcentaje';
    var benefitPerc = getValuesFromUL(ul, label);     
    $("benefitPercId").value = benefitPerc;

    // Oculta la ventana
    benefitsAndDiscounts.hideDialog();
}

/* Obtiene de cada LI dentro del UL los valores q estan en innerHTML (label-value)
 * Parsea de innerHTML y acumula.
 */
var getValuesFromUL = function(ul, label) {
    var lisCollection = ul.getElementsByTagName('li');
    var chosen = 0;
    for (var i = 0; i < lisCollection.length; i++) {
        var elem = lisCollection[i];

        if (elem.title == label) {
            var val = elem.innerHTML;
            var splitted = val.split(' - ');    
    
            chosen += parseFloat(splitted[1]);                 
        }
    }    
    
    return chosen;
}

/* Busca los LIs de un UL.
 * Saca los ids separados por ';' en un String 
 */
var getLisIds = function(ul) {
    var lisCollection = ul.getElementsByTagName('li');
    var chosen = "";
    for (var i = 0; i < lisCollection.length; i++) {
        var elem = lisCollection[i];
        
        chosen += elem.id;
        if (i != (lisCollection.length - 1)) {
            // Para evitar ponerlo en el ultimo...
            chosen += ";";
        }
    }    
    
    return chosen;
}

/* Objecto para manejar la ventana de beneficios y descuentos
 * Requiere EXT
 */
var benefitsAndDiscounts = function(){
    // define some private variables
    var dialog, showBtn;
    
    // return a public interface
    return {
        init : function(){
        },
        
        // Oculta
        hideDialog: function() {
            dialog.hide();
        },
       
        // Muestra
        showDialog : function(){
            if(!dialog){ // lazy initialize the dialog and only create it once
                dialog = new Ext.BasicDialog("benefit-dlg", { 
                        modal:true,
                        autoTabs:true,
                        width:600,
                        height:450,
                        shadow:true,
                        minWidth:300,
                        minHeight:250,
                        proxyDrag: true
                });
                dialog.addKeyListener(27, dialog.hide, dialog);
                dialog.addButton('Confirmar', confirmBenefitsAndDiscounts, dialog);
                dialog.addButton('Cancelar', dialog.hide, dialog);
            }
            
            dialog.show();
        }
    };
}();
